﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using SIGEB.Modelo.moduloUsuarios;
using SIGEB.Modelo;
using SIGEB.Prototipo.control;
using SIGEB.Prototipo.Vista.UI;

namespace SIGEB.Prototipo.Vista.moduloUsuarios
{
    public partial class busquedaUsuario : frm_Base
    {

        #region "constructores"

        public busquedaUsuario(LinkedList<usuario> datosActuales, objetoReturn retorno)
        {
            InitializeComponent();
            asignarUI(this.Controls);
            this.retorno = retorno;
            this.datosActuales = datosActuales;
            mostrarUsuarios(datosActuales);
            rbt_nombre.Checked = true;
            if (retorno == null)
            {
                throw new Exception("Objeto retorno no puede ser nulo");
            }
            retorno.objeto = "";
        }

        #endregion

        #region "eventos"

        private void txt_cedula_TextChanged(object sender, EventArgs e)
        {
            if (rbt_cedula.Checked && Validacion.validaCedula(txt_cedula.Text, true))
            {
                mostrarUsuarios(buscarCedula(datosActuales, txt_cedula.Text));
            }
            else
            {
                mostrarUsuarios(datosActuales);
            }
        }

        private void txt_id_TextChanged(object sender, EventArgs e)
        {
            if (rbt_id.Checked && !String.IsNullOrEmpty(txt_id.Text))
            {
                mostrarUsuarios(buscarId(datosActuales, txt_id.Text));
            }
            else
            {
                mostrarUsuarios(datosActuales);
            }
        }

        private void textBox3_TextChanged(object sender, EventArgs e)
        {
            if (rbt_nombre.Checked && !(String.IsNullOrEmpty(txt_nombre.Text) && String.IsNullOrEmpty(txt_apellido1.Text) && String.IsNullOrEmpty(txt_apellido2.Text)))
            {
                mostrarUsuarios(buscarNombre(datosActuales, txt_nombre.Text, txt_apellido1.Text, txt_apellido2.Text));
            }
            else
            {
                mostrarUsuarios(datosActuales);
            }
        }

        private void rbt_nombre_CheckedChanged(object sender, EventArgs e)
        {
            limpiarCampos();
            actualizarCampos();
        }

        private void dgv_usuarios_SelectionChanged(object sender, EventArgs e)
        {
            actualizarActual();
        }

        private void dgv_usuarios_CellContentDoubleClick(object sender, DataGridViewCellEventArgs e)
        {
            devolverSeleccionado();
        }

        #endregion

        #region "metodos"

        private void limpiarCampos()
        {
            txt_apellido1.Text = txt_apellido2.Text = txt_cedula.Text = txt_id.Text = txt_nombre.Text = "";
        }

        private void actualizarCampos()
        {
            txt_nombre.Enabled = txt_apellido1.Enabled = txt_apellido2.Enabled = rbt_nombre.Checked;
            txt_cedula.Enabled = rbt_cedula.Checked;
            txt_id.Enabled = rbt_id.Checked;
        }

        private void mostrarUsuarios(LinkedList<usuario> usuarios)
        {
            llenarColumnas();
            if (usuarios != null)
            {
                foreach (usuario actual in usuarios)
                {
                    dgv_usuarios.Rows.Add(actual.idUsuario, actual.nombre + " " + actual.apellido1 + " " + actual.apellido2, actual.cedula);
                }
            }
        }

        private void llenarColumnas()
        {
            dgv_usuarios.Columns.Clear();
            dgv_usuarios.Columns.Add("Identificacion", "Identificación");
            dgv_usuarios.Columns.Add("Nombre", "Identificación");
            dgv_usuarios.Columns.Add("Cedula", "Cédula");

        }

        private LinkedList<usuario> buscarCedula(LinkedList<usuario> usuarios,string cedula)
        {
            LinkedList<usuario> lista = new LinkedList<usuario>();
            if (usuarios != null && Validacion.validaCedula(cedula,true))
            {
                foreach (usuario act in usuarios)
                {
                    if (act.cedula == cedula)
                    {
                        lista.AddLast(act);
                        return lista;
                    }
                }
            }
            return lista;
        }

        private void asignarUI(System.Windows.Forms.Control.ControlCollection coleccion)
        {
            foreach (System.Windows.Forms.Control c in coleccion)
            {
                if (c.GetType().GetProperty("Font") != null)
                {
                    if (c is FlowLayoutPanel)
                        asignarUI(((FlowLayoutPanel)c).Controls);
                    else if (c is GroupBox)
                        asignarUI(((GroupBox)c).Controls);
                    else if (c is Panel)
                        asignarUI(((Panel)c).Controls);
                    else if (c is TabControl)
                        asignarUI(((TabControl)c).Controls);
                    else if (c is TableLayoutPanel)
                        asignarUI(((TableLayoutPanel)c).Controls);
                    else if (c is DataGridView)
                    {
                        ((DataGridView)c).ColumnHeadersDefaultCellStyle.Font = Fuente.obtenerFuente();
                        ((DataGridView)c).RowsDefaultCellStyle.Font = Fuente.obtenerFuente();
                    }
                    else if (c is DateTimePicker)
                        ((DateTimePicker)c).CalendarFont = Fuente.obtenerFuente();
                    c.Font = Fuente.obtenerFuente();
                }
            }
        }

        private LinkedList<usuario> buscarNombre(LinkedList<usuario> lista, string nombre, string apellido1, string apellido2)
        {
            LinkedList<usuario> completa = new LinkedList<usuario>();
            LinkedList<usuario> semiCompleta = new LinkedList<usuario>();
            LinkedList<usuario> casiNada = new LinkedList<usuario>();
            int coincidencia = 0;
            if (lista != null)
            {
                foreach (usuario act in lista)
                {
                    coincidencia = 0;
                    if (String1.contiene(act.nombre, nombre))
                    {
                        coincidencia++;
                    }
                    if (String1.contiene(act.apellido1, apellido1))
                    {
                        coincidencia++;
                    }
                    if (String1.contiene(act.apellido2, apellido2))
                    {
                        coincidencia++;
                    }
                    if (coincidencia == 1)
                    {
                        casiNada.AddLast(act);
                    }
                    else if (coincidencia == 2)
                    {
                        semiCompleta.AddLast(act);
                    }
                    else if (coincidencia == 3)
                    {
                        completa.AddLast(act);
                    }
                }
            }
            if (completa.Count != 0)
            {
                return completa;
            }
            if (semiCompleta.Count != 0)
            {
                return semiCompleta;
            }
            return casiNada;
        }

        private LinkedList<usuario> buscarId(LinkedList<usuario> lista, string id)
        {
            LinkedList<usuario> nueva = new LinkedList<usuario>();
            if (lista != null && !String.IsNullOrEmpty(id))
            {
                foreach (usuario act in lista)
                {
                    if (act.idUsuario == id)
                    {
                        nueva.AddLast(act);
                        return nueva;
                    }
                }
            }
            return nueva;
        }

        private usuario buscar1Id(LinkedList<usuario> lista, string id)
        {
            if (lista != null && !String.IsNullOrEmpty(id))
            {
                foreach (usuario act in lista)
                {
                    if (act.idUsuario == id)
                    {
                        return act;
                    }
                }
            }
            return null;
        }

        private void actualizarActual()
        {
            actual = buscar1Id(datosActuales, getFromDgv());
        }

        private string getFromDgv()
        {
            try
            {
                dgv_usuarios.Rows[dgv_usuarios.SelectedCells[0].RowIndex].Selected = true;
                String code = dgv_usuarios.SelectedRows[0].Cells[0].Value.ToString();
                return code;
            }
            catch
            {
                return null;
            }
        }

        private void devolverSeleccionado()
        {
            if (actual != null)
            {
                retorno.objeto = actual.idUsuario;
                this.Close();
            }
            else
            {
                MessageBox.Show("Debe escoger un Usuario");
            }
        }

        #endregion

        #region "metodos botones"

        private void btn_seleccionar_Click(object sender, EventArgs e)
        {
            devolverSeleccionado();
        }

        private void btn_cancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        #endregion

        #region "atributos"

        LinkedList<usuario> datosActuales;
        usuario actual;
        objetoReturn retorno; 

        #endregion
    }
}
